import { Observable } from "../Observable";
/**
 * take 操作符会从 Observable 中取出前 N 个值，然后完成。它是一个过滤操作符，可以用来限制 Observable 发送的值的数量
 * take 操作符会在 Observable 发送完 N 个值之后立即完成，因此你不需要使用 unsubscribe 方法取消订阅
 * @param {*} count
 * @returns
 */
export function take(count) {
  //source上游的可观察对象
  return (source) => {
    //记数器用来记录已经获取的值和数量
    let seen = 0;
    return new Observable(function (subscriber) {
      return source.subscribe({
        ...subscriber,
        //最关键的是要重写next方法,此value是老的Observable传过来的老值
        next: (value) => {
          seen++;
          if (seen <= count) {
            subscriber.next(value);
            if (seen >= count) {
              subscriber.complete();
            }
          }
        },
      });
    });
  };
}
